/// 通常和遍历所有节点有关系
part of "../tree_node.dart";

extension NodeLoop<T> on TreeNode<T> {
  /// 对含自己在内的每一个节点递归执行操作
  void forEach(Function(T x) onNode) {
    // 对自己执行操作
    if (this is T) onNode(this as T);

    for (T child in children) {
      if (child is TreeNode<T>) {
        // 如果子节点为树节点，则递归执行
        (child as TreeNode<T>).forEach(onNode);
      } else {
        // 如果不是，则只对自己执行
        onNode(child);
      }
    }
  }

  /// 递归处理每一项，并将结果返回为List
  List<E> map<E>(E Function(T x) onNode) {
    List<E> result = [];
    forEach((x) {
      result.add(onNode(x));
    });
    return result;
  }

  /// 对每一个节点进行累计操作（包含自己）
  E sum<E>(E initial, E Function(E total, T child) addMethod) {
    // 设置初始值
    E total = initial;

    // 对自己执行一次累加操作
    total = addMethod(total, this as T);

    // 对于每一项child
    for (T child in children) {
      if (child is TreeNode<T>) {
        // 如果child为树节点，则递归执行累加操作
        total = (child as TreeNode<T>).sum(total, addMethod);
      } else {
        // 否则直接相加
        total = addMethod(total, child);
      }
    }

    // 返回最终结果
    return total;
  }
}
